package org.tissou.client.DonneesAAfficher;

import com.google.gwt.user.client.ui.*;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import org.tissou.client.widgets.Label_MessageInformation;
import org.tissou.client.Services.RecuperationDonneesService.RecuperateurDonneesServices;
import org.tissou.client.Services.Parametres;

/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 03/03/2009
 * Time: 21:12:32
 * To change this template use File | Settings | File Templates.
 */
public class RecuperateurAfficheurDonnees {
  Tableau tableauAConstruireEtAfficher;
  ParametresQuery parametres;
  boolean boutons;
  DockPanel ouAfficher;
  Label_MessageInformation message_information;
  ClickHandler clickSurLeTableauHandler;

  ClickHandler clickHandlerGauche = new ClickHandler(){

      @Override
      public void onClick(ClickEvent event) {
        allerChercherDonneesDansLePasse();
      }
    };

  ClickHandler clickHandlerDroit = new ClickHandler(){

      @Override
      public void onClick(ClickEvent event) {
        allerChercherDonneesDansLeFutur();
      }
    };

  public RecuperateurAfficheurDonnees(ParametresQuery parametres,
                                      DockPanel ouAfficher,
                                      Label_MessageInformation message_information,
                                      ClickHandler clickSurLeTableauHandler) {
    this.parametres = parametres;
    if (parametres.getOffset()>-1){
      this.boutons = true;
    }
    else {
      this.boutons = false;
    }
    this.ouAfficher = ouAfficher;
    this.message_information = message_information;
    this.clickSurLeTableauHandler = clickSurLeTableauHandler;
  }

  public RecuperateurAfficheurDonnees(ParametresQuery parametres,
                                      DockPanel ouAfficher,
                                      Label_MessageInformation message_information) {
    this.parametres = parametres;
    if (parametres.getOffset()>-1){
      this.boutons = true;
    }
    else {
      this.boutons = false;
    }
    this.ouAfficher = ouAfficher;
    this.message_information = message_information;
    this.clickSurLeTableauHandler = null;
  }

  private void allerChercherDonneesDansLeFutur(){
    ParametresQuery nouveauxParametres;
    int i = parametres.getOffset() - parametres.nombredeligne;
    if (i >= 0){
      nouveauxParametres = ParametresQuery.genererNouveauxParametresChangerOffset(parametres,i);
    }
    else {
      nouveauxParametres = parametres;
    }
    RecuperateurAfficheurDonnees nouveauRecuperateur = new RecuperateurAfficheurDonnees(nouveauxParametres,
        ouAfficher, message_information, clickSurLeTableauHandler);
    nouveauRecuperateur.recupererEtAfficherDonnees();
  }

  private void allerChercherDonneesDansLePasse(){
    ParametresQuery nouveauxParametres =
        ParametresQuery.genererNouveauxParametresChangerOffset(parametres,
            parametres.getOffset() + parametres.nombredeligne);
    RecuperateurAfficheurDonnees nouveauRecuperateur = new RecuperateurAfficheurDonnees(nouveauxParametres,
        ouAfficher, message_information, clickSurLeTableauHandler);
    nouveauRecuperateur.recupererEtAfficherDonnees();
  }

  private void serveurPasMarche(Throwable caught){
     System.out.println(caught.getLocalizedMessage());
     message_information.setMessage(Label_MessageInformation.Etat.SERVICEPASMARCHE, caught.getLocalizedMessage());
  }

  private void serveurMarche (Donnees_Base result){
    ouAfficher.clear();
    tableauAConstruireEtAfficher = new Tableau(result);

    if (boutons){
      DockPanel panel_boutons = new DockPanel();
      DockPanel panel_tableau = new DockPanel();
      HTML label_blanc = new HTML("&nbsp;");

      tableauAConstruireEtAfficher.afficherDans(panel_tableau,DockPanel.NORTH);
      panel_boutons.setWidth(String.valueOf(panel_tableau.getOffsetWidth()));
      Hyperlink bouton_gauche = new Hyperlink();
      bouton_gauche.setText("<< Avant");
      bouton_gauche.addClickHandler(clickHandlerGauche);
      Hyperlink bouton_droit = new Hyperlink();
      bouton_droit.setText("Apres >>");
      bouton_droit.addClickHandler(clickHandlerDroit);
      panel_boutons.add(bouton_gauche, DockPanel.WEST);
      bouton_gauche.setWidth("75px");
      panel_boutons.add(bouton_droit, DockPanel.EAST);
      bouton_droit.setWidth("75px");
      panel_boutons.add(label_blanc, DockPanel.CENTER);
      panel_boutons.setCellWidth(label_blanc, "100%");
      
      ouAfficher.add(panel_boutons, DockPanel.NORTH);

      ouAfficher.add(panel_tableau, DockPanel.NORTH);
    }
    else {
      tableauAConstruireEtAfficher.afficherDans(ouAfficher,DockPanel.NORTH);
    }
    message_information.setMessage(Label_MessageInformation.Etat.NEUTRE, "");
    if (clickSurLeTableauHandler!=null){
      tableauAConstruireEtAfficher.addClickHandler(clickSurLeTableauHandler);
    }
  }


  public void recupererEtAfficherDonnees(){
     AsyncCallback c = new AsyncCallback<Donnees_Base>(){

      public void onFailure(Throwable caught) {
        serveurPasMarche(caught);
      }

      public void onSuccess(Donnees_Base result) {
        serveurMarche(result);
     }
    };
    message_information.setMessage(Label_MessageInformation.Etat.SERVICEATTENTE,"En attente des donnees du serveur.");
    RecuperateurDonneesServices.App.getInstance().RecupererDonnees(parametres, c);
  }

}
